package demo.ioc.my.core.ctx;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 所有ApplicationContext实现类的基类！强制要求！
 * <p>
 * Created by 张少昆 on 2018/3/18.
 */
public abstract class AbstractApplicationContext implements ApplicationContext {

    /*** 存储所有扫描到的Class！*/
    protected static final List<Class<?>> CLASS_LIST = new ArrayList<>();
    /*** 存储所有Class及其对象！*/
    protected static final Map<Class<?>, Object> CLASS_INSTANCE_MAP = new HashMap<>();

    /*** parent ctx */
    protected ApplicationContext PARENT = null;

    /**
     * 初始化方法，在这里面完成对两个final字段的初始操作！-强制要求，方便阅读。
     */
    abstract void init();

    public void setParentApplicationContext(ApplicationContext PARENT){
        this.PARENT = PARENT;
    }

    @Override
    public ApplicationContext getParentApplicationContext(){
        return PARENT;
    }

    @Override
    public <T> T getBean(Class<T> clzz){
        Object o = CLASS_INSTANCE_MAP.get(clzz);
        return (T) o;
    }
}
